-
-
Notifications
You must be signed in to change notification settings - Fork 378
zero size structs with extern (C) attribute #3093
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
Thanks for your pull request, @WalterBright! Bugzilla referencesYour PR doesn't reference any Bugzilla issue. If your PR contains non-trivial changes, please reference a Bugzilla issue or create a manual changelog. |
$(P Structs with no fields of non-zero size (aka $(I Empty Structs)) have a size of one byte.) | ||
$(P A struct with no fields of non-zero size is an $(I Empty Struct). | ||
An Empty Struct with a $(DDSUBLINK spec/attribute, linkage, Linkage Attribute) of `extern (C)` has a size of zero. | ||
Otherwise, its size is one byte.) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is wrong. I think you wanted to say that empty extern (C) struct
size is the same as with the underlying C compiler. Also you might want to add what happens if the C compiler simply disallows empty structs?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
C11 6.7.2.1-8 says "If the struct-declaration-list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined."
Undefined behavior is not disallowed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we encounter a C compiler with different behavior, we'll adjust the spec.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From what I recall, the problem being that gcc and clang don't agree with each other on the same platform. So you could choose to imitate gcc on Linux, but then you're abi incompatible with clang on Linux - which someone might instead choose to use.
But that's all by the by.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Undefined behavior is not disallowed.
The point is, undefined behaviour allows refusal to compile. A reasonable C compiler could emit an error when encountering an empty struct.
If we encounter a C compiler with different behavior, we'll adjust the spec.
Better, but why not do it right away?
ping @WalterBright |
1375ade
to
98c53a3
Compare
98c53a3
to
ef3fc7f
Compare
Clear up documentation to correspond with dlang/dmd#13009